#include "package.h"

typedef unsigned short u_short;

/* Coloca cabecalho da camada de enlace */
int insert_header( packet_t pck, char ack, int numseq, char* buf, int bufsize )
{
    pck[0] = ack;                                   // coloca ACK
    memcpy( pck + ACK_SIZE, &numseq, NUMSEQ_SIZE ); // coloca numseq
                                                    // bytes 5 e 6 reservados para checksum
    memcpy( pck + HEADER_SIZE, buf, bufsize );      // coloca buf
    int total_size = bufsize + HEADER_SIZE;         // tamanho total do quadro (carga util + cabecalho)
    insert_cksum( pck, total_size );                // coloca checksum
    return total_size;
}

/* Apaga cabecalho da camada de enlace */
int erase_header( packet_t pck, char* buf, int bufsize )
{
    int total_size = bufsize - HEADER_SIZE;         // pacote sem cabecalho
    memcpy( pck, buf + HEADER_SIZE, total_size );   // copia carga util
    return total_size;
}

/* Retorna o numero de sequencia (ID) do pacote pck */
int get_numseq( packet_t pck )
{
    int pck_numseq;
    memcpy(&pck_numseq, pck + ACK_SIZE, NUMSEQ_SIZE);
    return pck_numseq;
}

/* Retorna o char que indica se pck e' um ack ('1' se positivo e '0' se negativo) */
char get_ack( packet_t pck )
{
    char pck_ack;
    pck_ack = pck[0];
    return pck_ack;
}

/* Retorna o char que indica se pck e' um ack ('1' se positivo e '0' se negativo) */
u_short get_cksum( packet_t pck )
{
    u_short pck_cksum;
    memcpy(&pck_cksum, pck + ACK_SIZE + NUMSEQ_SIZE, CK_LENGTH);
    return pck_cksum;
}
